import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import router from '@/router'
let count = 0;
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent

    if (store.getters.token) {
      config.headers.token = getToken()
    }
    count++
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    count--
    return Promise.reject(error)
  }
)
service.interceptors.response.use(async(response) => {
  count--
  console.log(response)
  const { data, statusText, status } = response // 默认json格式
  if (status === 200) {
    // console.log('响应data', data)
    // console.log(statusText)
    if (data?.code === 401 && count === 0) {
      Message({ type: 'error', message: '身份认证失败，请重新登录' })
      // 退出登录
      await store.dispatch('user/logOut')
      // 跳转回登录页面
      router.push('/login')
      // 中止程序
      return Promise.reject(new Error(statusText))
    }
    return data
  } else {
    Message({ type: 'error', statusText })
    return Promise.reject(new Error(statusText))
  }
}, async(error) => {
  // 处理token失效的问题
  // 发现401的时候，退出登录，清空token和用户信息，提示用户重新登录
  console.log(error, 'error')
  count--
  if (error.response.code === 401 && count === 0) {
    Message({ type: 'error', message: '身份认证失败，请重新登录' })
    // 退出登录
    await store.dispatch('user/logOut')
    // 跳转回登录页面
    router.push('/login')
    // 中止程序
    return Promise.reject(error)
  }
  // 把错误消息提示给用户
  Message({ type: 'error', message: error.message })
  // 中止程序执行
  return Promise.reject(error)
})

export default service
